/*
 * Copyright 2021-2025 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.fastjson.serializer;

import java.io.IOException;
import java.lang.reflect.Type;

import com.alibaba.fastjson.JSONException;

/**
 * @author wenshao[szujobs@hotmail.com]
 */
public class EasyjPrimitiveArraySerializer implements ObjectSerializer {

	public static final EasyjPrimitiveArraySerializer INSTANCE = new EasyjPrimitiveArraySerializer();

	@Override
	public final void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
		SerializeWriter out = serializer.out;

		if (object == null) {
			out.writeNull(SerializerFeature.WriteNullListAsEmpty);
			return;
		}

		if (object instanceof int[]) {
			int[] array = (int[])object;
			out.write('[');
			for (int i = 0; i < array.length; ++i) {
				if (i != 0) {
					out.write(',');
				}
				out.writeInt(array[i]);
			}
			out.write(']');
			return;
		}

		if (object instanceof short[]) {
			short[] array = (short[])object;
			out.write('[');
			for (int i = 0; i < array.length; ++i) {
				if (i != 0) {
					out.write(',');
				}
				out.writeInt(array[i]);
			}
			out.write(']');
			return;
		}

		if (object instanceof long[]) {
			long[] array = (long[])object;

			out.write('[');
			for (int i = 0; i < array.length; ++i) {
				if (i != 0) {
					out.write(',');
				}
				ObjectSerializer writer = serializer.config.getObjectWriter(Long.class);
				try {
					writer.write(serializer, array[i], null, null, 0);
				} catch (IOException e) {
					throw new JSONException(e.getMessage(), e);
				}
			}
			out.write(']');
			return;
		}

		if (object instanceof boolean[]) {
			boolean[] array = (boolean[])object;
			out.write('[');
			for (int i = 0; i < array.length; ++i) {
				if (i != 0) {
					out.write(',');
				}
				out.write(array[i]);
			}
			out.write(']');
			return;
		}

		if (object instanceof float[]) {
			float[] array = (float[])object;
			out.write('[');
			for (int i = 0; i < array.length; ++i) {
				if (i != 0) {
					out.write(',');
				}

				float item = array[i];
				if (Float.isNaN(item)) {
					out.writeNull();
				} else {
					out.append(Float.toString(item));
				}
			}
			out.write(']');
			return;
		}

		if (object instanceof double[]) {
			double[] array = (double[])object;
			out.write('[');
			for (int i = 0; i < array.length; ++i) {
				if (i != 0) {
					out.write(',');
				}

				double item = array[i];
				if (Double.isNaN(item)) {
					out.writeNull();
				} else {
					out.append(Double.toString(item));
				}
			}
			out.write(']');
			return;
		}

		if (object instanceof byte[]) {
			byte[] array = (byte[])object;
			out.writeByteArray(array);
			return;
		}

		char[] chars = (char[])object;
		out.writeString(chars);
	}
}